home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PsL Monthly 1993 December
/
PSL Monthly Shareware CD-ROM (December 1993).iso
/
prgmming
/
dos
/
pascal
/
pars7.exe
/
BUILDER.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1993-04-29
|
36KB
|
1,203 lines
unit builder;
{$O+,F+}
interface
uses realtype,pars7glb;
procedure parsefunction(s:string;var fop:operationpointer;
var pointx,pointy,pointt,a,b,c,d,e:rpointer;var numop:integer;
var error:boolean; showprogress:boolean);
implementation
type sstring=string;
termsorttype=(variab,constant,brack,minus,sum,diff,prod,divis,
intpower,realpower,cosine,sine,expo,logar,sqroot,arctang,
square,third,forth,abso,maxim,minim,heavi,
phase,randfunc,argu,hypersine,hypercosine,radius,
randrand);
procedure chopblanks(var s:sstring); forward;
{deletes all blanks in s}
procedure checkbracketnum(s:sstring; var result:boolean); forward;
{checks whether # of '(' equ. # of ')'}
procedure checknum(s:sstring;var num:float;var result:boolean); forward;
{checks whether s is a number}
procedure checkvar(s:sstring;var varsort:word;var result:boolean); forward;
{checks whether s is a variable string}
procedure checkparam(s:sstring;var parsort:word;var result:boolean); forward;
{checks whether s is a parameter string}
procedure checkbrack(s:sstring;var s1:sstring;var result:boolean); forward;
{checks whether s =(...(s1)...) and s1 is a valid term}
procedure checkmin(s:sstring;var s1:sstring;var result:boolean); forward;
{checks whether s denotes the negative value of a valid operation}
procedure checksum(s:sstring;var s1,s2:sstring;var result:boolean); forward;
{checks whether '+' is the primary operation in s}
procedure checkdiff(s:sstring;var s1,s2:sstring;var result:boolean); forward;
{checks whether '-' is the primary operation in s}
procedure checkprod(s:sstring;var s1,s2:sstring;var result:boolean); forward;
{checks whether '*' is the primary operation in s}
procedure checkdiv(s:sstring;var s1,s2:sstring;var result:boolean); forward;
{checks whether '/' is the primary operation in s}
procedure check2varfunct(s:sstring;var s1,s2:sstring;var fsort:
termsorttype;var result:boolean); forward;
{checks whether s=f(s1,s2); s1,s2 being valid terms}
procedure checkfunct(s:sstring;var s1:sstring;var fsort:termsorttype;
var result:boolean); forward;
{checks whether s denotes the evaluation of a function fsort(s1)}
procedure checkintpower(s:sstring;var s1,s2:sstring;var result:boolean); forward;
{checks whether s=s1^s2, s2 integer}
procedure checkrealpower(s:sstring;var s1,s2:sstring;var result:boolean); forward;
{checks whether s=s1^s2, s2 real}
procedure chopblanks(var s:sstring);
var i:byte;
begin
while pos(' ',s)>0 do
begin
i:=pos(' ',s);
delete(s,i,1);
end;
end;
procedure checkbracketnum(s:sstring; var result:boolean);
var lauf,lzu,i:integer;
begin
lauf:=0;lzu:=0;i:=0;
result:=false;
repeat
i:=i+1;
if copy(s,i,1)='(' then
lauf:=lauf+1;
if copy(s,i,1)=')' then
lzu:=lzu+1;
until i>=length(s);
if lauf=lzu then
result:=true;
end;
procedure checknum(s:sstring;var num:float;var result:boolean);
var code,p,i:integer; n:longint; num1:float; s1,s2:sstring;
begin
result:=false;
if s='Pi' then
begin
result:=true;
num:=Pi;
exit;
end
else
begin
val(s,num,code);
if code=0 then
result:=true;
end;
end;
procedure checkparam(s:sstring; var parsort:word; var result:boolean);
begin
result:=false;
if length(s)<>1 then exit else
begin
if s='A' then begin
result:=true; parsort:=1; exit; end;
if s='B' then begin
result:=true; parsort:=2; exit; end;
if s='C' then begin
result:=true; parsort:=3; exit; end;
if s='D' then begin
result:=true; parsort:=4; exit; end;
if s='E' then begin
result:=true; parsort:=5; exit; end;
end;
end;
procedure checkvar(s:sstring;var varsort:word;var result:boolean);
begin
result:=false;
if length(s)<>1 then exit else
begin
if s='x' then
begin
result:=true;
varsort:=1;
exit;
end;
if s='y' then
begin
result:=true;
varsort:=2;
exit;
end;
if s='t' then
begin
result:=true;
varsort:=3;
exit;
end;
end;
end;
procedure checkbrack(s:sstring;var s1:sstring;var result:boolean);
var s2,s3:sstring; num:float; fsort:termsorttype; varsort:word;
begin
result:=false;
if copy(s,1,1)='(' then
if copy(s,length(s),1)=')' then
begin
s1:=copy(s,2,length(s)-2);
checksum(s1,s2,s3,result); if result then exit;
checknum(s1,num,result); if result then exit;
checkdiff(s1,s2,s3,result); if result then exit;
checkmin(s1,s2,result);if result then exit;
checkprod(s1,s2,s3,result);if result then exit;
checkdiv(s1,s2,s3,result);if result then exit;
check2varfunct(s1,s2,s3,fsort,result);if result then exit;
checkfunct(s1,s2,fsort,result);if result then exit;
checkvar(s1,varsort,result);if result then exit;
checkparam(s1,varsort,result);if result then exit;
checkintpower(s1,s2,s3,result);if result then exit;
checkrealpower(s1,s2,s3,result);if result then exit;
checkbrack(s1,s2,result);
if result then begin s1:=s2; exit; end;
end;
end;
procedure checkmin(s:sstring;var s1:sstring;var result:boolean);
var s2,s3:sstring; num:float; fsort:termsorttype; varsort:word;
begin
result:=false;
if copy(s,1,1)='-' then
begin
s1:=copy(s,2,length(s)-1);
checkbrack(s1,s2,result);
if result then begin
s1:=s2; exit; end;
checkvar(s1,varsort,result); if result then exit;
checkparam(s1,varsort,result); if result then exit;
checkfunct(s1,s2,fsort,result); if result then exit;
check2varfunct(s1,s2,s3,fsort,result); if result then exit;
checkintpower(s1,s2,s3,result); if result then exit;
checkrealpower(s1,s2,s3,result); if result then exit;
end;
end;
procedure checksum(s:sstring;var s1,s2:sstring;var result:boolean);
var s3,s4:sstring; i,j:byte; num:float; fsort:termsorttype;varsort:word;
begin
result:=false;
i:=0;
repeat
j:=pos('+',copy(s,i+1,length(s)-i));
if j>0 then
begin
i:=i+j;
if (i<length(s)) and (i>1) then
begin
s1:=copy(s,1,i-1); s2:=copy(s,i+1,length(s)-i);
checkbracketnum(s1,result); if result then
checkbracketnum(s2,result); if result then
begin
checkvar(s1,varsort,result);
if not result then
checknum(s1,num,result);
if not result then
checkparam(s1,varsort,result);
if not result then
begin
checkbrack(s1,s3,result);
if result then s1:=s3; end;
if not result then
checkmin(s1,s3,result);
if not result then
checkdiff(s1,s3,s4,result);
if not result then
checkprod(s1,s3,s4,result);
if not result then
checkdiv(s1,s3,s4,result);
if not result then
check2varfunct(s1,s3,s4,fsort,result);
if not result then
checkfunct(s1,s3,fsort,result);
if not result then
checkintpower(s1,s3,s4,result);
if not result then
checkrealpower(s1,s3,s4,result);
if result then
begin
checkvar(s2,varsort,result); if result then exit;
checknum(s2,num,result);if result then exit;
checkparam(s2,varsort,result); if result then exit;
checkbrack(s2,s3,result);
if result then begin
s2:=s3; exit; end;
checksum(s2,s3,s4,result);if result then exit;
checkdiff(s2,s3,s4,result);if result then exit;
checkprod(s2,s3,s4,result);if result then exit;
checkdiv(s2,s3,s4,result);if result then exit;
checkfunct(s2,s3,fsort,result);if result then exit;
check2varfunct(s2,s3,s4,fsort,result);if result then exit;
checkintpower(s2,s3,s4,result);if result then